package org.dromara.lessor.service;

import org.dromara.admin.domain.bo.OrderBo;
import org.dromara.lessor.domain.vo.HouseVo;
import org.dromara.lessor.domain.bo.HouseBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;

import java.util.Collection;
import java.util.List;

/**
 * 房源信息Service接口
 *
 * @author Lion Li
 * @date 2025-09-01
 */
public interface IHouseService {

    /**
     * 查询房源信息
     *
     * @param id 主键
     * @return 房源信息
     */
    HouseVo queryById(Long id);

    /**
     * 分页查询房源信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 房源信息分页列表
     */
    TableDataInfo<HouseVo> queryPageList(HouseBo bo, PageQuery pageQuery);

    /**
     * 分页查询管理查询二审租客房源订单
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 房源信息分页列表
     */
    TableDataInfo<HouseVo> twoInstanceList(HouseBo bo, PageQuery pageQuery);

    /**
     * 分页查询已出租的房源信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 房源信息分页列表
     */
    TableDataInfo<HouseVo> queryRentedList(HouseBo bo, PageQuery pageQuery);

    /**
     * 分页查询当前业务员的房源信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 房源信息分页列表
     */
    TableDataInfo<HouseVo> queryPageMyHouseList(HouseBo bo, PageQuery pageQuery, Long userId);

    /**
     * 业务员查询自己办理的房源订单
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @param userId    业务员ID
     * @return 房源信息分页列表
     */
    TableDataInfo<HouseVo> queryPageMyOrderList(HouseBo bo, PageQuery pageQuery, Long userId);

    /**
     * 分页查询用户的房源信息列表
     * @param bo
     * @param pageQuery
     * @return
     */
    TableDataInfo<HouseVo> queryTenantPageList(HouseBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的房源信息列表
     *
     * @param bo 查询条件
     * @return 房源信息列表
     */
    List<HouseVo> queryList(HouseBo bo);

    /**
     * 新增房源信息
     *
     * @param bo 房源信息
     * @return 是否新增成功
     */
    Boolean insertByBo(HouseBo bo);

    /**
     * 修改房源信息
     *
     * @param bo 房源信息
     * @return 是否修改成功
     */
    Boolean updateByBo(HouseBo bo);

    /**
     * 校验并批量删除房源信息信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 业务员办单
     * @param houseBo 房源业务对象
     * @return
     */
    String handleRent(HouseBo houseBo);

    /**
     * 用户租房
     * @param bo 房源
     * @param userId 用户id
     * @return
     */
    Boolean rentHouseByHouseId(OrderBo bo, Long userId);

    /**
     * 审核出租方发布的房源信息
     * @param houseBo 房源业务对象
     * @return
     */
    Boolean handleLessorRent(HouseBo houseBo);

    /**
     * 后台管理员审核房屋合同
     * @param houseBo 房源业务对象(含房源ID和审核的状态)
     * @return
     */
    Boolean handleContract(HouseBo houseBo);

    /**
     * 业务员办单后取消订单
     * @param houseId 房源ID
     * @return
     */
    Boolean saleCancel(Long houseId);

    /**
     * 切换房源上架状态
     * @param id
     * @return
     */
    Boolean toggleLaunch(Long id);
}
